﻿/**	@file		rwlocker.h
 *	@date		(2009-03-17 01:35:10)/(2009-07-18 12:08:29)
 *-----------------------------------------------------------------------------
 *	@version	1.0.3.4
 *	@author		Nick Shallery	(nicknide@gmail.com)
 *	@copyright	YOU HAVE ALL LEFT WITH THIS CODE WHILE YOU KEEP COMMENT IN EVERY COPY.
 *-----------------------------------------------------------------------------
**/

#if			!defined(__LOLIX__LOLI__RWLOCKER__NICK__K_IN_G__)
#define		__LOLIX__LOLI__RWLOCKER__NICK__K_IN_G__
//==============================================================================
//--------------------------------------------------------------------------

#if			!defined(__LOLIX__LOLIX_TYPE__K_IN_G__)
	#include	"../lolix_type.h"
#endif	//	!defined(__LOLIX__LOLIX_TYPE__K_IN_G__)

namespace	lolix{namespace loli{
	class	rwlocker;
}}

class	LOLIX_NO_VTABLE	lolix::loli::rwlocker
	: public lolix::itf
{
public:
	LOLIX_DEFINE_FACTORY((0x98e3b6d0, 0x042c4ca5, 0x852d7019, 0x7591379d), (rwlocker** out_ptr, const wchar_t* log_name));
	LOLIX_DECLARE_ITF(lolix::loli::rwlocker, lolix::itf, (0x0d875643, 0x41734c6c, 0x8fdb0801, 0xa8844acf));
	class	LOLIX_NO_VTABLE	key
		: public lolix::itf
	{
		LOLIX_DECLARE_ITF(lolix::loli::rwlocker::key, lolix::itf, (0xfc72c894, 0x2ffd4048, 0x8019fcc9, 0x3814def4));
		//===========================================================================
		//	锁定读取
		//===========================================================================
		LOLIX_INTERFACE(lread	, void	, (void));

		//===========================================================================
		//	锁定写入
		//===========================================================================
		LOLIX_INTERFACE(lwrite	, void	, (void));

		//===========================================================================
		//	解除读锁
		//===========================================================================
		LOLIX_INTERFACE(ulread	, void	, (void));

		//===========================================================================
		//	解除写锁
		//===========================================================================
		LOLIX_INTERFACE(ulwrite	, void	, (void));
	};

	//===========================================================================
	//	请求一把钥匙
	//---------------------------------------------------------------------------
	//	out_ptr		[ o] :	返回的钥匙
	//---------------------------------------------------------------------------
	//		钥匙不能跨线程交换, 因此最好在当前堆栈上下文使用
	//===========================================================================
	LOLIX_INTERFACE(query_key, LOLIX_RETNV	, (key** out_ptr));

	//===========================================================================
	//	锁定读取
	//===========================================================================
	LOLIX_INTERFACE(lread	, void	, (void));

	//===========================================================================
	//	锁定写入
	//===========================================================================
	LOLIX_INTERFACE(lwrite	, void	, (void));

	//===========================================================================
	//	解除读锁
	//===========================================================================
	LOLIX_INTERFACE(ulread	, void	, (void));

	//===========================================================================
	//	解除写锁
	//===========================================================================
	LOLIX_INTERFACE(ulwrite	, void	, (void));
};

//--------------------------------------------------------------------------
//==============================================================================
#endif	//	!defined(__LOLIX__LOLI__RWLOCKER__NICK__K_IN_G__)
